program bspline ;

{$U+}

 type
   arry = array [1..20,1..2] of integer ;
 var
   knotk , knotn , n , k , i , j : integer ;
   arr : arry ;
   m , x , y : real ;

 function knot ( i : integer ) : integer ;
  begin
   if i < knotk then
     knot := 0
   else
     if i > knotn then
       knot := knotn - knotk + 2
     else
       knot := i - knotk + 1 ;
  end ;

 function nblend ( i , k : integer ; u : real ) : real ;
  var
    t:integer ;
    v:real ;
  begin
   if k = 1 then
    begin
      v := 0 ;
      if ( knot( i ) <= u ) and ( u < knot( i + 1 ) ) then
         v := 1 ;
    end
   else
    begin
      v := 0 ;
      t := knot( i + k - 1 ) - knot( i ) ;
      if t <> 0 then
        v := ( u - knot( i ) ) * nblend( i , k - 1 , u ) / t ;
      t := knot( i + k ) - knot( i + 1 ) ;
      if t <> 0 then
        v := v + ( knot( i + k ) - u ) * ( nblend( i + 1 , k - 1 , u ) / t ) ;
    end ;
    nblend := v ;
  end ;

 procedure spline( var x , y : real ; u : real ; n , k : integer ; var a : arry ) ;
  var
   i : integer ;
   b : real ;
  begin
    knotk := k ;
    knotn := n ;
    x := 0 ;
    y := 0 ;
    for i := 1 to ( n + 1 ) do
     begin
       b := nblend( i , k , u ) ;
       x := x + a[i,1] * b ;
       y := y + a[i,2] * b ;
     end ;
  end ;

 begin
   writeln ;
   writeln ;
   writeln ;
   write('Give the number of control points : ') ;
   readln(n) ;
   k := 4 ;
   for i := 1 to n do
    begin
      writeln ;
      write('X[',i,'] : ') ;
      readln(arr[i,1]) ;
      write('Y[',i,'] : ') ;
      readln(arr[i,2]) ;
    end ;
   hires ;
   {graphmode ;}
  { arr[n+1,1] := arr[1,1] ;
   arr[n+1,2] := arr[1,2] ;}
   for i := 1 to n-1 do
      draw(arr[i,1],arr[i,2],arr[i+1,1],arr[i+1,2],1) ;
   m := n - k + 2 ;
   for i := 0 to 400 do
    begin
      spline(x,y,i/400 * m,n,k,arr) ;
      plot(round(x),round(y),1) ;
    end ;
   readln ;
   textmode(bw80) ;
 end .